import geojson
from geojson import Feature, FeatureCollection, Polygon
import numpy as np

with open('district.geojson', 'rb') as f:
    districts = geojson.load(f)  # 读取geojson格式文件
features = []  # 保存各个区域geojson信息
color = []  # 保存区域id及对应颜色深浅相对值
for idx, geometry in enumerate(districts['features']):  # 提取所有区域
    # 获取经纬度列表[[lon, lat], ...]，两次[0]是由于该列表被嵌套在两层列表中
    circle = geometry['geometry']['coordinates'][0][0]
    # 染色区域id，颜色相对深度, 这里设置为0~100的随机数
    color.append([str(idx), np.random.randint(100)])
    polygon = Polygon([circle])  # 区域经纬度
    features.append(Feature(
        id=str(idx),  # 指定geojson的id值，染色时使用该id与color中的idx匹配
        geometry=polygon
    ))
feature_collection = FeatureCollection(features)  # 生成绘制所需格式的geojson

import folium
import pandas as pd

map = folium.Map(
    location=[39.30029918615029, 103.88671875],  # 初始化地图中心
    zoom_start=4,  # 初始化放大级别
    # 设置地图样式，可选择其他瓦片(tile)
    tiles=('https://api.tiles.mapbox.com/v4/mapbox.streets/{z}/{x}/{y}.png'
           + '?access_token=pk.eyJ1IjoibHVrYXNtYXJ0aW5lbGxpIiwiYSI6ImNpem8'
           + '5dmhwazAyajIyd284dGxhN2VxYnYifQ.HQCmyhEXZUTz3S98FMrVAQ'),
    attr='China'  # 显示在地图右下角的自定义文字
)

folium.Choropleth(
    geo_data=feature_collection,  # 传入geojson
    name='choropleth',
    data=pd.DataFrame(color, columns=['idx', 'color']),  # 颜色数据
    columns=['idx', 'color'],  # 染色区域id，颜色相对深度列名
    key_on='feature.id',  # geojson区域id
    fill_color='BuPu',  # 颜色样式
    fill_opacity=0.5,  # 区域透明度
    line_opacity=0.2,  # 边缘透明度
    legend_name='Rank'  # 图例名
).add_to(map)
# map # 在jupyter使用这句可直接显示地图
# map.save('map.html') # 保存到当前工作目录下
